<!DOCTYPE html>
<!-- saved from url=(0127)https://docs.google.com/document/d/e/2PACX-1vRYtnTBGZTNUzEJgP3P5d1YOmCgyIcnnJfJICwwsvhsgT8pkhP442fLiS5aqK9HbIZRwQaW8baD9T4o/pub -->
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>WebPerfWG call - May 7 2020</title><link rel="shortcut icon" href="https://ssl.gstatic.com/docs/documents/images/kix-favicon7.ico"><meta name="referrer" content="strict-origin-when-cross-origin"><style type="text/css" nonce="">
      @import url("https://fonts.googleapis.com/css?family=Google+Sans");
      @import url("https://fonts.googleapis.com/css?family=Roboto");

      body {
        font-family: Roboto, arial, sans, sans-serif;
        margin: 0;
      }

      iframe {
        border: 0;
        frameborder: 0;
        height: 100%;
        width: 100%;
      }

      #header {
        align-items: center;
        background: white;
        border-bottom: 1px #ccc solid;
        display: flex;
        height: 60px;
        justify-content: space-between;
        position: fixed;
        top: 0;
        width: 100%;
        z-index: 100;
      }

      #header #title {
        font-family: 'Google Sans';
        font-size: large;
        margin: auto 0 auto 20px;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
        width: 70%;
      }

      #header #interval {
        margin: auto 25px auto 0;
        font-family: Roboto;
        font-size: small;;
      }

      #footer {
        background: #f0f0f0;
        border-bottom: 1px #ccc solid;
        bottom: 0;
        font-family: Roboto;
        font-size: small;
        padding: 10px 10px;
        position: fixed;
        text-align: center;
        width: 100%;
      }

      #contents {
        padding: 100px 20% 50px 20%;
      }

      @media only screen and (max-device-width: 800px) {
        #header {
          border-bottom-width: 5px;
          height: auto;
          display: block;
        }

        #header #title {
          font-size: 3em;
          margin: auto 0 auto 20px;
          width: 90%;
        }

        #header #interval {
          font-size: 1.5em;
          margin: 10px 0 auto 25px;
        }

        #contents {
          padding: 150px 5% 80px;
        }

        #footer {
          font-size: 2em;
        }
      }

      .dash {
        padding: 0 6px;
      }
    </style></head><body><div id="header"><div id="title">WebPerfWG call - May 7 2020</div><div id="interval"><span></span></div></div><div id="contents"><style type="text/css">ul.lst-kix_hx2lcp1e82ga-1{list-style-type:none}ul.lst-kix_hx2lcp1e82ga-0{list-style-type:none}.lst-kix_hx2lcp1e82ga-5>li:before{content:"\0025a0  "}.lst-kix_hx2lcp1e82ga-4>li:before{content:"\0025cb  "}.lst-kix_hx2lcp1e82ga-6>li:before{content:"\0025cf  "}.lst-kix_hx2lcp1e82ga-0>li:before{content:"\0025cf  "}.lst-kix_hx2lcp1e82ga-8>li:before{content:"\0025a0  "}.lst-kix_hx2lcp1e82ga-7>li:before{content:"\0025cb  "}.lst-kix_qq3rkfe7wav-0>li:before{content:"\0025cf  "}.lst-kix_qq3rkfe7wav-1>li:before{content:"\0025cb  "}.lst-kix_hx2lcp1e82ga-1>li:before{content:"\0025cb  "}.lst-kix_hx2lcp1e82ga-2>li:before{content:"\0025a0  "}.lst-kix_hx2lcp1e82ga-3>li:before{content:"\0025cf  "}ul.lst-kix_ktfpkg9mmvfr-5{list-style-type:none}.lst-kix_qq3rkfe7wav-7>li:before{content:"\0025cb  "}.lst-kix_qq3rkfe7wav-8>li:before{content:"\0025a0  "}.lst-kix_ktfpkg9mmvfr-0>li:before{content:"\0025cf  "}ul.lst-kix_ktfpkg9mmvfr-6{list-style-type:none}ul.lst-kix_ktfpkg9mmvfr-7{list-style-type:none}ul.lst-kix_ktfpkg9mmvfr-8{list-style-type:none}ul.lst-kix_ktfpkg9mmvfr-1{list-style-type:none}.lst-kix_qq3rkfe7wav-5>li:before{content:"\0025a0  "}.lst-kix_ktfpkg9mmvfr-1>li:before{content:"\0025cb  "}.lst-kix_ktfpkg9mmvfr-2>li:before{content:"\0025a0  "}ul.lst-kix_ktfpkg9mmvfr-2{list-style-type:none}ul.lst-kix_ktfpkg9mmvfr-3{list-style-type:none}ul.lst-kix_ktfpkg9mmvfr-4{list-style-type:none}.lst-kix_qq3rkfe7wav-3>li:before{content:"\0025cf  "}.lst-kix_qq3rkfe7wav-4>li:before{content:"\0025cb  "}ul.lst-kix_ktfpkg9mmvfr-0{list-style-type:none}.lst-kix_qq3rkfe7wav-2>li:before{content:"\0025a0  "}.lst-kix_ktfpkg9mmvfr-7>li:before{content:"\0025cb  "}.lst-kix_ktfpkg9mmvfr-5>li:before{content:"\0025a0  "}.lst-kix_ktfpkg9mmvfr-6>li:before{content:"\0025cf  "}.lst-kix_ktfpkg9mmvfr-3>li:before{content:"\0025cf  "}.lst-kix_ktfpkg9mmvfr-4>li:before{content:"\0025cb  "}.lst-kix_qq3rkfe7wav-6>li:before{content:"\0025cf  "}li.li-bullet-0:before{margin-left:-18pt;white-space:nowrap;display:inline-block;min-width:18pt}ul.lst-kix_qq3rkfe7wav-3{list-style-type:none}ul.lst-kix_qq3rkfe7wav-4{list-style-type:none}.lst-kix_ktfpkg9mmvfr-8>li:before{content:"\0025a0  "}ul.lst-kix_qq3rkfe7wav-1{list-style-type:none}ul.lst-kix_qq3rkfe7wav-2{list-style-type:none}ul.lst-kix_qq3rkfe7wav-7{list-style-type:none}ul.lst-kix_qq3rkfe7wav-8{list-style-type:none}ul.lst-kix_qq3rkfe7wav-5{list-style-type:none}ul.lst-kix_qq3rkfe7wav-6{list-style-type:none}ul.lst-kix_hx2lcp1e82ga-3{list-style-type:none}ul.lst-kix_hx2lcp1e82ga-2{list-style-type:none}ul.lst-kix_hx2lcp1e82ga-5{list-style-type:none}ul.lst-kix_hx2lcp1e82ga-4{list-style-type:none}ul.lst-kix_hx2lcp1e82ga-7{list-style-type:none}ul.lst-kix_hx2lcp1e82ga-6{list-style-type:none}ul.lst-kix_qq3rkfe7wav-0{list-style-type:none}ul.lst-kix_hx2lcp1e82ga-8{list-style-type:none}ol{margin:0;padding:0}table td,table th{padding:0}.c3{margin-left:36pt;padding-top:0pt;padding-left:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c1{margin-left:72pt;padding-top:0pt;padding-left:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c9{padding-top:16pt;padding-bottom:4pt;line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.c8{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Arial";font-style:italic}.c12{padding-top:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left;height:11pt}.c10{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:16pt;font-family:"Arial";font-style:normal}.c11{color:#434343;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:14pt;font-family:"Arial";font-style:normal}.c0{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Arial";font-style:normal}.c7{padding-top:18pt;padding-bottom:6pt;line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.c13{padding-top:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c6{text-decoration-skip-ink:none;-webkit-text-decoration-skip:none;color:#1155cc;text-decoration:underline}.c14{background-color:#ffffff;max-width:468pt;padding:72pt 72pt 72pt 72pt}.c5{color:inherit;text-decoration:inherit}.c4{padding:0;margin:0}.c2{font-weight:700}.title{padding-top:0pt;color:#000000;font-size:26pt;padding-bottom:3pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.subtitle{padding-top:0pt;color:#666666;font-size:15pt;padding-bottom:16pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}li{color:#000000;font-size:11pt;font-family:"Arial"}p{margin:0;color:#000000;font-size:11pt;font-family:"Arial"}h1{padding-top:20pt;color:#000000;font-size:20pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h2{padding-top:18pt;color:#000000;font-size:16pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h3{padding-top:16pt;color:#434343;font-size:14pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h4{padding-top:14pt;color:#666666;font-size:12pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h5{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h6{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;font-style:italic;orphans:2;widows:2;text-align:left}</style><div class="c14"><h2 class="c7" id="h.7e4yn9ul7fnp"><span class="c10">Participants</span></h2><p class="c13"><span class="c0">Gilles Dubuc, Yoav Weiss, Nic Jansma, Michal Mocny, Benjamin De Kosnik, Nicol&aacute;s Pe&ntilde;a, Marcus Armstrong, Annie Sullivan, Philippe Le Hegaret</span></p><p class="c12"><span class="c0"></span></p><h2 class="c7" id="h.chlybajmpxya"><span class="c10">Next Call</span></h2><ul class="c4 lst-kix_ktfpkg9mmvfr-0 start"><li class="c3 li-bullet-0"><span class="c0">Tues May 19th @ 10am PST / 1pm EST</span></li></ul><h2 class="c7" id="h.d1comgtdis7i"><span class="c10">Discussions</span></h2><h3 class="c9" id="h.xa6fnyizcug9"><span class="c11">EventTiming Updates</span></h3><ul class="c4 lst-kix_qq3rkfe7wav-0 start"><li class="c3 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span class="c0"><b></b>: Added a method that looks at the dictionary of the .observe() call and if there’s a duration threshold, and smaller delays than the threshold aren’t sent to the observer.</span></li><li class="c3 li-bullet-0"><span class="c0">… Also, there’s no way to determine which entries to add to the buffer in PerformanceTimeline.</span></li><li class="c3 li-bullet-0"><span class="c0">… On the last call we talked about adding only entries with a duration over a hundred, even though we support observing entries of 16ms or more.</span></li><li class="c3 li-bullet-0"><span class="c0">… Maybe we can hack “should add entry” and make it also about the performance timeline only.</span></li><li class="c3 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: So the buffer would have a different threshold?</span></li><li class="c3 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span class="c0"><b></b>: We can do that or accumulate everything.</span></li><li class="c3 li-bullet-0"><span class="c2">Yoav</span><span class="c0"><b></b>: Buffering “everything” runs a risk accumulating entries for every single input event, of bloating memory. &nbsp;Where if it’s just for “slow” events, it’s not as big of a deal.</span></li><li class="c3 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span class="c0"><b></b>: True, but there is also a buffer limit.</span></li><li class="c3 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: I would want to make sure it’s called out in the spec that the .observe() and PerformanceTimeline have different thresholds for what shows up.</span></li><li class="c3 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span class="c0"><b></b>: Worried it would be confusing with the buffered entries having a different threshold.</span></li><li class="c3 li-bullet-0"><span class="c0">… The default for duration would be the slow entries, and duration threshold enables you to get more than that.</span></li><li class="c3 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: Just to restate what you said: So only buffer events at 100ms and that would be the default, but the observer can go below that using the duration threshold?</span></li><li class="c3 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span class="c0"><b></b>: Yeah. Interested in feedback about this threshold, and general feedback about EventTiming would be good, because Chrome is interested in shipping it.</span></li><li class="c3 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: From Akamai’s perspective, hoping to collect data to supplement existing polyfill.</span></li><li class="c3 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span class="c0"><b></b>: Would be great to compare polyfill to native implementation.</span></li><li class="c3 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: We should have that data, so can verify that at some point.</span></li><li class="c3 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span class="c0"><b></b>: How do you verify that there’s a handler at the beginning of the page load?</span></li><li class="c3 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: That’s one of the downsides with our polyfill right now, is we don’t.</span></li><li class="c3 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span class="c0"><b></b>: I’d expect native times (especially for event processing time) to be larger.</span></li><li class="c3 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: We’re telling customers we’re expecting differences.</span></li><li class="c3 li-bullet-0"><span class="c2"><b>Yoav</b>: </span><span class="c0">Any other API feedback?</span></li><li class="c3 li-bullet-0"><span class="c2">Steven</span><span class="c0"><b></b>: Looks good, we’ll use it.</span></li><li class="c3 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span class="c0"><b></b>: User input in general doesn’t occur early on, so most entries won’t be buffered, so buffering only the slow ones shouldn’t have a huge impact.</span></li></ul><h3 class="c9" id="h.alejygxg0eru"><span class="c11">Resource Timing</span></h3><ul class="c4 lst-kix_qq3rkfe7wav-0"><li class="c3 li-bullet-0"><span class="c6"><a class="c5" href="https://www.google.com/url?q=https://github.com/w3c/resource-timing/issues/71&amp;sa=D&amp;source=editors&amp;ust=1613234615958000&amp;usg=AOvVaw3sCMHooT11tq5FCPunpFt0">https://github.com/w3c/resource-timing/issues/71</a></span></li></ul><ul class="c4 lst-kix_qq3rkfe7wav-1 start"><li class="c1 li-bullet-0"><span class="c8">Transition Level 2 to CR</span></li><li class="c1 li-bullet-0"><span class="c2"><b>Nic</b>: </span><span class="c0">Tracking to get to CR</span></li><li class="c1 li-bullet-0"><span class="c0">… List of issues needed for Level 2</span></li><li class="c1 li-bullet-0"><span class="c0">… List of open test bugs</span></li><li class="c1 li-bullet-0"><span class="c2">AI</span><span class="c0"><b></b>: Yoav to update</span></li></ul><ul class="c4 lst-kix_qq3rkfe7wav-0"><li class="c3 li-bullet-0"><span class="c6"><a class="c5" href="https://www.google.com/url?q=https://github.com/w3c/resource-timing/issues/198&amp;sa=D&amp;source=editors&amp;ust=1613234615959000&amp;usg=AOvVaw2DAjoSmV4kKkuvjh_3l1LT">https://github.com/w3c/resource-timing/issues/198</a></span></li></ul><ul class="c4 lst-kix_qq3rkfe7wav-1 start"><li class="c1 li-bullet-0"><span class="c8">Register TAO as Permanent Message Header Field Name</span></li><li class="c1 li-bullet-0"><span class="c2"><b>Nic</b>: </span><span class="c0">Register TAO headers once we hit PR</span></li><li class="c1 li-bullet-0"><span>… Can’t make progress yet, so skipping</span></li></ul><ul class="c4 lst-kix_qq3rkfe7wav-0"><li class="c3 li-bullet-0"><span class="c6"><a class="c5" href="https://www.google.com/url?q=https://github.com/w3c/resource-timing/issues/200&amp;sa=D&amp;source=editors&amp;ust=1613234615959000&amp;usg=AOvVaw2EYmFt_BZZB20t54WhxOzb">https://github.com/w3c/resource-timing/issues/200</a></span></li></ul><ul class="c4 lst-kix_qq3rkfe7wav-1 start"><li class="c1 li-bullet-0"><span class="c8">Be a bit more explicit about which subresources are to be ignored from stylesheets</span></li><li class="c1 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: What do we do about grandchildren resources.</span></li><li class="c1 li-bullet-0"><span class="c2">Yoav</span><span class="c0"><b></b>: How to describe everything in that dependency tree should be invisible? &nbsp;Without having to describe a dependency tree</span></li><li class="c1 li-bullet-0"><span>…</span><span class="c0">&nbsp;I need to figure out language, it might be hand-wavy, but we can then wait for when CSS integrates with fetch to be able to better describe it (i.e. the ancestry relationship in fetch).</span></li><li class="c1 li-bullet-0"><span class="c0">… As long as CSS is not integrated into fetch, no point in even going that route because it won’t help us here</span></li><li class="c1 li-bullet-0"><span class="c2"><b>Nic</b>: </span><span class="c0">So hand-wavey text for now?</span></li><li class="c1 li-bullet-0"><span class="c2">Yoav:</span><span>&nbsp;I think that’s the best we can do</span></li><li class="c1 li-bullet-0"><span class="c0">... We’ll also need tests, I don’t think any implementation follows this</span></li></ul><ul class="c4 lst-kix_qq3rkfe7wav-0"><li class="c3 li-bullet-0"><span class="c2">Nic</span><span><b></b>: Besides those L2 issues, we have some </span><span class="c6"><a class="c5" href="https://www.google.com/url?q=https://github.com/w3c/resource-timing/issues/71%23issuecomment-462167655&amp;sa=D&amp;source=editors&amp;ust=1613234615960000&amp;usg=AOvVaw1l_kRslU-JxUyIf1sdyMqG">tests</a></span><span class="c0">&nbsp;that need to be addressed</span></li><li class="c3 li-bullet-0"><span class="c2">Yoav</span><span class="c0"><b></b>: I’ll take an action item to re-look at where tests are</span></li><li class="c3 li-bullet-0"><span class="c2"><b>Nic</b>: </span><span>Next are untriaged issues, let’s find a milestone for them</span></li><li class="c3 li-bullet-0"><span class="c6"><a class="c5" href="https://www.google.com/url?q=https://github.com/w3c/resource-timing/issues/226&amp;sa=D&amp;source=editors&amp;ust=1613234615961000&amp;usg=AOvVaw0RvsnaG7r0ysqrlZ42U3d7">https://github.com/w3c/resource-timing/issues/226</a></span></li></ul><ul class="c4 lst-kix_qq3rkfe7wav-1 start"><li class="c1 li-bullet-0"><span class="c8">Pass realm when creating PerformanceResourceTiming</span></li><li class="c1 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span class="c0"><b></b>: Unclear what’s the right answer, can wait for Fetch integration. Not high priority</span></li><li class="c1 li-bullet-0"><span class="c0">.... Fetch integration would be Level 3</span></li><li class="c1 li-bullet-0"><span class="c2">Yoav:</span><span class="c0">&nbsp;I don’t think a change here is highly observable or likely to affect the API shape, we just need to properly define it and it would be hard to do that before Fetch integration.</span></li><li class="c1 li-bullet-0"><span>… So it can wait</span></li></ul><ul class="c4 lst-kix_qq3rkfe7wav-0"><li class="c3 li-bullet-0"><span class="c6"><a class="c5" href="https://www.google.com/url?q=https://github.com/w3c/resource-timing/issues/220&amp;sa=D&amp;source=editors&amp;ust=1613234615962000&amp;usg=AOvVaw2aBryjWGrWj339gfAge7Ud">https://github.com/w3c/resource-timing/issues/220</a></span></li></ul><ul class="c4 lst-kix_qq3rkfe7wav-1 start"><li class="c1 li-bullet-0"><span class="c8">Provide a TAO-bypass for Navigation timing</span></li><li class="c1 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: NavTiming entries are not gated by TAO while RT is. Mostly an editorial change</span></li><li class="c1 li-bullet-0"><span class="c2">Yoav</span><span class="c0"><b></b>: Some timestamps are related to current document (e.g. current pages’ DNS / TCP). &nbsp;</span></li><li class="c1 li-bullet-0"><span class="c0">… Things that concern the document being fetched, so are always same-origin (to itself)</span></li><li class="c1 li-bullet-0"><span class="c0">… But there are other timestamps related to the unload of the previous page (e.g. unloadEventStart) that shouldn’t be TAO bound but just same-origin bound</span></li><li class="c1 li-bullet-0"><span class="c0">… We had discussed all of these at the latest Face-to-Face and so don’t need to be clarified but just editorial changes</span></li><li class="c1 li-bullet-0"><span>... </span><span>Make sure these changes are tested</span></li></ul><ul class="c4 lst-kix_qq3rkfe7wav-0"><li class="c3 li-bullet-0"><span class="c2">Nic</span><span><b></b>: 3x issues from PING</span></li><li class="c3 li-bullet-0"><span class="c2">Yoav</span><span class="c0"><b></b>: Let’s dive into each individually</span></li><li class="c3 li-bullet-0"><span class="c6"><a class="c5" href="https://www.google.com/url?q=https://github.com/w3c/resource-timing/issues/221&amp;sa=D&amp;source=editors&amp;ust=1613234615963000&amp;usg=AOvVaw0h4pJFSysffIy5l7Ihy37W">https://github.com/w3c/resource-timing/issues/221</a></span></li></ul><ul class="c4 lst-kix_qq3rkfe7wav-1 start"><li class="c1 li-bullet-0"><span class="c2">Yoav</span><span class="c0"><b></b>: nextHopProtocol is exposing unique information that the visitor is behind</span></li><li class="c1 li-bullet-0"><span class="c0">... Could expose if user is behind a proxy, or VPN or has Anti-Virus installed</span></li><li class="c1 li-bullet-0"><span class="c0">… Many things that can change that first hop</span></li><li class="c1 li-bullet-0"><span class="c0">... nextHopProtocol is not TAO bound, and maybe it should be? But that could be tangential to this question</span></li><li class="c1 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span class="c0"><b></b>: Are we OK with exposing VPN/Proxy usage or do we need to re-evaluate the attribute</span></li><li class="c1 li-bullet-0"><span class="c2">Yoav</span><span class="c0"><b></b>: My thinking is that it doesn’t expose anything specific -- it says “supports H2” or “not H2” etc, and these are all things that are already somewhat observable, e.g. very clear request patterns (from ResourceTiming) where you can tell the difference between H1 and H2</span></li><li class="c1 li-bullet-0"><span class="c0">... My claim is this information is already exposed</span></li><li class="c1 li-bullet-0"><span class="c0">... Proxies that are privacy-aware could support H2/H3, and try to mirror the origin</span></li><li class="c1 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: Proxy would have a hard time knowing origin protocol until client already connected with their preferred protocol</span></li><li class="c1 li-bullet-0"><span class="c2">Yoav</span><span class="c0"><b></b>: Good point. &nbsp;Generally, we think this is a consideration we took into account when we shipped nextHopProtocol.</span></li><li class="c1 li-bullet-0"><span class="c2">Benjamin</span><span class="c0"><b></b>: We’re concerned about this, PING pointed out a valid issue here</span></li><li class="c1 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span class="c0"><b></b>: Could you clarify how this information is already exposed</span></li><li class="c1 li-bullet-0"><span class="c2">Yoav</span><span class="c0"><b></b>: If you look at multiple connections to the same host, and you have connect time for only the first one, and the rest seemingly use the connection. &nbsp;For H1 you’d expect up to 6 total connections with distinct timings. &nbsp;Where H2 is not.</span></li><li class="c1 li-bullet-0"><span class="c0">… For H2 vs H3 the differences are more subtle and it could be a bit harder. &nbsp;For H1 vs H2 it’s easy to write a script that finds that distinction.</span></li><li class="c1 li-bullet-0"><span class="c0">... Not sure what the real privacy benefits would be</span></li><li class="c1 li-bullet-0"><span class="c0">... Will run it by Chrome and Google privacy folks to get their take</span></li><li class="c1 li-bullet-0"><span class="c2">Benjamin</span><span class="c0"><b></b>: What are the risks to doing what they ask, i.e. what is the harm in conceding to their request</span></li><li class="c1 li-bullet-0"><span class="c2">Yoav</span><span class="c0"><b></b>: Harm of removing nextHopProtocol: Won’t be able to easily segment the impact of underlying protocol rollouts on traffic. &nbsp;H1 to H2 rollout is not done. &nbsp;Properties are making that transition and they want to prove to themselves that it’s a worthy one and this allows them to measure that. H2 to H3 allows them to switch some percent of their protocol, and measure the differences.</span></li><li class="c1 li-bullet-0"><span class="c0">… When we shipped nextHopProtocol, we didn’t have ServerTiming. &nbsp;Can this be exposed via that?</span></li><li class="c1 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: From Akamai’s perspective and its customers, it has been invaluable. For rollouts, our customers can segment and measure their traffic.</span></li><li class="c1 li-bullet-0"><span class="c0">… As well as internally, when we’re deploying new protocols at Akamai, we can measure the impact.</span></li><li class="c1 li-bullet-0"><span class="c0">.... If it can be done with server timing? ST can come from multiple hops, where we’re mostly interested in last hop.</span></li><li class="c1 li-bullet-0"><span class="c2">Yoav</span><span class="c0"><b></b>: One problem is that Server-Timing is set at the application layer, done independently to the layer making the decision on the protocol. &nbsp;It would require the network layer mark the protocol to the application layer who would mark it via Server-Timing headers going down</span></li><li class="c1 li-bullet-0"><span class="c2">AI</span><span class="c0"><b></b>: Yoav to talk to privacy folks to see if the user impact is meaningful and Nic/Yoav to talk to ops folks to see if ST can be a replacement.</span></li></ul><ul class="c4 lst-kix_qq3rkfe7wav-0"><li class="c3 li-bullet-0"><span class="c0">There are two other related one around TAO, but we’ll talk about these at a later date</span></li></ul><ul class="c4 lst-kix_qq3rkfe7wav-1 start"><li class="c1 li-bullet-0"><span class="c6"><a class="c5" href="https://www.google.com/url?q=https://github.com/w3c/resource-timing/issues/222&amp;sa=D&amp;source=editors&amp;ust=1613234615966000&amp;usg=AOvVaw2KPzXBW41EV_6EC0HpGsBF">https://github.com/w3c/resource-timing/issues/222</a></span></li><li class="c1 li-bullet-0"><span class="c6"><a class="c5" href="https://www.google.com/url?q=https://github.com/w3c/resource-timing/issues/223&amp;sa=D&amp;source=editors&amp;ust=1613234615966000&amp;usg=AOvVaw1Rf9r-sp_luJkQbZ0Xc6bk">https://github.com/w3c/resource-timing/issues/223</a></span></li></ul><h3 class="c9" id="h.jc4qrq64ze27"><span class="c11">Page Visibility / Paint Timing issues</span></h3><ul class="c4 lst-kix_qq3rkfe7wav-0"><li class="c3 li-bullet-0"><span class="c6"><a class="c5" href="https://www.google.com/url?q=https://github.com/w3c/page-visibility/issues/29&amp;sa=D&amp;source=editors&amp;ust=1613234615967000&amp;usg=AOvVaw2KwDmT9D-89JGEdaf1Ww0B">https://github.com/w3c/page-visibility/issues/29</a></span></li><li class="c3 li-bullet-0"><span class="c6"><a class="c5" href="https://www.google.com/url?q=https://github.com/w3c/paint-timing/issues/40&amp;sa=D&amp;source=editors&amp;ust=1613234615967000&amp;usg=AOvVaw0s71E5P2d9DyRFgK-ZScWZ">https://github.com/w3c/paint-timing/issues/40</a></span><span class="c0">&nbsp;</span></li></ul><ul class="c4 lst-kix_qq3rkfe7wav-1 start"><li class="c1 li-bullet-0"><span class="c8">Log if a page was ever visible</span></li><li class="c1 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span class="c0"><b></b>: Two options for determining if a page was visible before</span></li><li class="c1 li-bullet-0"><span class="c0">… You can listen to event handler to get state changes but that doesn’t work for later-loading scripts</span></li><li class="c1 li-bullet-0"><span class="c0">… First option is to have a flag on events that notes if the page was hidden previously</span></li><li class="c1 li-bullet-0"><span class="c0">… Second option is to have an observer so you can see the entire state of page visibility changes</span></li><li class="c1 li-bullet-0"><span class="c0">… Developers on public-webperf mailing list generally preferred the second option, Page Vis Observer (PVO), but there is some feedback in Github issue around discoverability that this could be important</span></li><li class="c1 li-bullet-0"><span class="c2">Philip</span><span class="c0"><b></b>: Issue is more about discoverability that would have to know that Page Visibility affects Paint Timing. &nbsp;Could be easier for developers to discover this if it was on the entry</span></li><li class="c1 li-bullet-0"><span class="c0">... We see many cases on the internet where people are not checking this case (that visibility affected the paint timing entry)</span></li><li class="c1 li-bullet-0"><span class="c0">… Having something as simple as possible would be ideal.</span></li><li class="c1 li-bullet-0"><span class="c0">... The other concern I have is if the PVO is async and the Paint Timing Observer (PTO) is async you need to wait a bit to check both of them. So it’s a little bit awkward.</span></li><li class="c1 li-bullet-0"><span class="c0">... My thought is that we should do both -- PVO is useful, but a flag is also useful. &nbsp;“The user thinks maybe you shouldn’t trust this entry because X,Y,Z”. &nbsp;There are many possible reasons in the future why having it on the entry may be useful</span></li><li class="c1 li-bullet-0"><span class="c2">Yoav</span><span class="c0"><b></b>: PVO will give us a full picture of how impacted the resource is, and give developers the option to still count the experience, or segment it. &nbsp;Visibility is possibly not the only thing that would cause tainting. &nbsp;Having both is a matter of resources and but both seems valuable</span></li><li class="c1 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span class="c0"><b></b>: Right now we would only have one tainted reason (background) -- we’re not ready to have other interoperable reasons for tainted</span></li><li class="c1 li-bullet-0"><span class="c2">Philip</span><span class="c0"><b></b>: Do we need a reason, versus just a boolean?</span></li><li class="c1 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span class="c0"><b></b>: Github issue requests there’s a string reason instead of just a boolean</span></li><li class="c1 li-bullet-0"><span class="c2">Yoav</span><span class="c0"><b></b>: In the future we may have other reasons that affect events. &nbsp;E.g. during a Long Task. &nbsp;Right now it’s mostly related to visibility, but in the future may find additional events that impact entry types.</span></li><li class="c1 li-bullet-0"><span class="c2">Philip</span><span class="c0"><b></b>: Layout Shifts has a flag that mentions input happened recently</span></li><li class="c1 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: We may then want to have an array of tainted reasons. &nbsp;Starts going down a rabbit hole a little bit.</span></li><li class="c1 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span class="c0"><b></b>: Initially it could be an array as empty [] or single string [“background”]</span></li><li class="c1 li-bullet-0"><span class="c2">Yoav</span><span class="c0"><b></b>: For example, segmenting between visibility-related or if Dev Tools was open</span></li><li class="c1 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: If we do say just “tained” boolean, users will always immediately want to know “why”. &nbsp;Maybe they do want it, maybe not, but without more details they might not know.</span></li><li class="c1 li-bullet-0"><span class="c2">Yoav</span><span class="c0"><b></b>: ResourceTiming: Dev Tools was open and Network Throttling was enabled</span></li><li class="c1 li-bullet-0"><span class="c0">… Maybe we don’t want to enumerate all the tainting reasons right now</span></li><li class="c1 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: Next steps?</span></li><li class="c1 li-bullet-0"><span class="c0">… Broad support for PageVisibility Observer. Go forward with that.</span></li><li class="c1 li-bullet-0"><span class="c0">… Maybe we continue the discussion for the tainted attribute on the issue</span></li><li class="c1 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span><b></b>: See the value but can add complexity</span></li></ul></div></div><div id="footer"><span>Published by <a target="_blank" title="Learn more about Google Drive" href="https://docs.google.com/">Google Drive</a></span><span class="dash">–</span><a href="https://docs.google.com/u/0/abuse?id=AKkXjoyHYgdOz_ea_uIaG2GGfbB7PKXlM_riGJz4Zr8yGsgrNSDYQGKmj8xU7ZImsHq1XxQe5pfxI9CNgbb5gzU:0">Report Abuse</a></div><script type="text/javascript" nonce="">(function(){/*

 Copyright The Closure Library Authors.
 SPDX-License-Identifier: Apache-2.0
*/
var aa="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a};function ba(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b<a.length;++b){var c=a[b];if(c&&c.Math==Math)return c}throw Error("Cannot find global object");}var ca=ba(this);
function da(a,b){if(b)a:{var c=ca;a=a.split(".");for(var d=0;d<a.length-1;d++){var e=a[d];if(!(e in c))break a;c=c[e]}a=a[a.length-1];d=c[a];b=b(d);b!=d&&null!=b&&aa(c,a,{configurable:!0,writable:!0,value:b})}}var ea="function"==typeof Object.create?Object.create:function(a){function b(){}b.prototype=a;return new b},fa;
if("function"==typeof Object.setPrototypeOf)fa=Object.setPrototypeOf;else{var ha;a:{var ia={a:!0},ja={};try{ja.__proto__=ia;ha=ja.a;break a}catch(a){}ha=!1}fa=ha?function(a,b){a.__proto__=b;if(a.__proto__!==b)throw new TypeError(a+" is not extensible");return a}:null}var ka=fa;
function h(a,b){a.prototype=ea(b.prototype);a.prototype.constructor=a;if(ka)ka(a,b);else for(var c in b)if("prototype"!=c)if(Object.defineProperties){var d=Object.getOwnPropertyDescriptor(b,c);d&&Object.defineProperty(a,c,d)}else a[c]=b[c];a.o=b.prototype}da("Object.is",function(a){return a?a:function(b,c){return b===c?0!==b||1/b===1/c:b!==b&&c!==c}});var l=this||self;function la(){}function ma(a){var b=typeof a;return"object"==b&&null!=a||"function"==b}
function na(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();d.push.apply(d,arguments);return a.apply(this,d)}}function oa(a,b){function c(){}c.prototype=b.prototype;a.o=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.B=function(d,e,f){for(var g=Array(arguments.length-2),k=2;k<arguments.length;k++)g[k-2]=arguments[k];return b.prototype[e].apply(d,g)}}function pa(a){return a};var qa=Array.prototype.indexOf?function(a,b){return Array.prototype.indexOf.call(a,b,void 0)}:function(a,b){if("string"===typeof a)return"string"!==typeof b||1!=b.length?-1:a.indexOf(b,0);for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1};function ra(a,b,c){for(var d in a)b.call(c,a[d],d,a)};var m;function p(a,b){this.i=a===sa&&b||"";this.j=ta}p.prototype.h=!0;p.prototype.g=function(){return this.i};var ta={},sa={};var ua=String.prototype.trim?function(a){return a.trim()}:function(a){return/^[\s\xa0]*([\s\S]*?)[\s\xa0]*$/.exec(a)[1]},va=/&/g,wa=/</g,xa=/>/g,ya=/"/g,za=/'/g,Aa=/\x00/g,Ba=/[\x00&<>"']/;function Ca(a,b){return a<b?-1:a>b?1:0};function q(a,b){this.i=b===r?a:""}q.prototype.h=!0;q.prototype.g=function(){return this.i.toString()};q.prototype.toString=function(){return this.i.toString()};function u(a){return a instanceof q&&a.constructor===q?a.i:"type_error:SafeUrl"}
var Da=/^(?:audio\/(?:3gpp2|3gpp|aac|L16|midi|mp3|mp4|mpeg|oga|ogg|opus|x-m4a|x-matroska|x-wav|wav|webm)|font\/\w+|image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp|x-icon)|video\/(?:mpeg|mp4|ogg|webm|quicktime|x-matroska))(?:;\w+=(?:\w+|"[\w;,= ]+"))*$/i,Ea=/^data:(.*);base64,[a-z0-9+\/]+=*$/i,Fa=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;function Ga(a){if(a instanceof q)return a;a="object"==typeof a&&a.h?a.g():String(a);Fa.test(a)||(a="about:invalid#zClosurez");return new q(a,r)}
var r={},Ha=new q("about:invalid#zClosurez",r);var v;a:{var Ia=l.navigator;if(Ia){var Ja=Ia.userAgent;if(Ja){v=Ja;break a}}v=""}function w(a){return-1!=v.indexOf(a)};function x(a,b,c){this.i=c===Ka?a:""}x.prototype.h=!0;x.prototype.g=function(){return this.i.toString()};x.prototype.toString=function(){return this.i.toString()};var Ka={};function La(a,b,c,d){a=a instanceof q?a:Ga(a);b=b||l;c=c instanceof p?c instanceof p&&c.constructor===p&&c.j===ta?c.i:"type_error:Const":c||"";return void 0!==d?b.open(u(a),c,d,void 0):b.open(u(a),c)};function Ma(a){Ma[" "](a);return a}Ma[" "]=la;function y(a,b,c){return Object.prototype.hasOwnProperty.call(a,b)?a[b]:a[b]=c(b)};var Na=w("Opera"),z=w("Trident")||w("MSIE"),Oa=w("Edge"),Pa=Oa||z,Qa=w("Gecko")&&!(-1!=v.toLowerCase().indexOf("webkit")&&!w("Edge"))&&!(w("Trident")||w("MSIE"))&&!w("Edge"),Ra=-1!=v.toLowerCase().indexOf("webkit")&&!w("Edge"),Sa=w("Macintosh");function Ta(){var a=l.document;return a?a.documentMode:void 0}var Ua;
a:{var Va="",Wa=function(){var a=v;if(Qa)return/rv:([^\);]+)(\)|;)/.exec(a);if(Oa)return/Edge\/([\d\.]+)/.exec(a);if(z)return/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(Ra)return/WebKit\/(\S+)/.exec(a);if(Na)return/(?:Version)[ \/]?(\S+)/.exec(a)}();Wa&&(Va=Wa?Wa[1]:"");if(z){var Xa=Ta();if(null!=Xa&&Xa>parseFloat(Va)){Ua=String(Xa);break a}}Ua=Va}var Ya=Ua,Za={},$a;if(l.document&&z){var ab=Ta();$a=ab?ab:parseInt(Ya,10)||void 0}else $a=void 0;var bb=$a;function cb(a){return y(a.prototype,"$$generatedClassName",function(){return"Class$obf_"+{valueOf:function(){return++db}}})}var db=1E3;function A(){}A.prototype.u=function(){return this.j||(Object.defineProperties(this,{j:{value:++eb,enumerable:!1}}),this.j)};A.prototype.toString=function(){var a=B(fb(gb(this.constructor)))+"@";var b=(this.u()>>>0).toString(16);return a+B(b)};function D(){}h(D,A);D.prototype.i=function(a){this.h=a;if(a instanceof Object)try{a.A=this}catch(b){}};function hb(a){a.h instanceof Error&&(Error.captureStackTrace?Error.captureStackTrace(a.h):a.h.stack=Error().stack)}D.prototype.toString=function(){var a=fb(gb(this.constructor)),b=this.l;return null==b?a:B(a)+": "+B(b)};function ib(){}h(ib,D);function jb(){}h(jb,ib);var eb=0;function E(){}h(E,jb);E.prototype.i=function(a){jb.prototype.i.call(this,Object.is(this.g,"__noinit__")?a:this.g)};function kb(){}h(kb,E);function lb(a,b){return"string"==typeof a?a.charCodeAt(b):a.g(b)};function B(a){return null==a?"null":a.toString()}function mb(a){return 65536<=a?B(String.fromCharCode((55296+((a-65536|0)>>10&1023)|0)&65535))+B(String.fromCharCode((56320+((a-65536|0)&1023)|0)&65535)):String.fromCharCode(a&65535)}function nb(a,b){var c=b,d=a.length,e;b=lb(a,(e=c,c=c+1|0,e));var f;if(e=55296<=b&&56319>=b&&c<d)a=f=lb(a,c),e=56320<=a&&57343>=a;var g;e?g=65536+((b&1023)<<10)+(f&1023)|0:g=b;return g};function ob(a,b){this.h=a;this.g=b}h(ob,A);function fb(a){var b=cb(a.h);0!=a.g&&(b="L"+B(b)+";");a=a.g;for(var c="",d=0;d<a;d=d+1|0)c=B(c)+"[";return B(c)+B(b)}ob.prototype.toString=function(){return"class "+B(fb(this))};function gb(a){var b=0;return y(a.prototype,"$$class/"+b,function(){return new ob(a,b)})};function pb(a,b){return null==a?a:b?decodeURI(a):decodeURIComponent(a)};var qb=/^(?:([^:/?#.]+):)?(?:\/\/(?:([^/?#]*)@)?([^/#?]*?)(?::([0-9]+))?(?=[/#?]|$))?([^?#]+)?(?:\?([^#]*))?(?:#([\S\s]*))?$/;function rb(a){a=qb.exec(a);for(var b=[],c=0;7>=c;c=c+1|0)a.length<=c||null==a[c]?b.push(null):b.push(a[c]);return b}
function sb(a,b){var c=a.indexOf(mb(35));c=0>c?a.length:c;a:{var d=0;for(var e=b.length;0<(d=a.indexOf(b,d))&&d<c;){var f=nb(a,d-1|0);if(38==f||63==f){if((d+e|0)>=a.length)break a;f=nb(a,d+e|0);if(61==f||38==f||35==f)break a}d=d+(e+1)|0}d=-1}if(0>d)return null;e=a.indexOf(mb(38),d);if(0>e||e>c)e=c;d=d+(b.length+1)|0;b=Math.min(a.length,d);a=a.substr(b,Math.min(a.length,Math.max(d,e))-b|0);c=" ";for(b=0;0<=(b=c.indexOf("\\",b));)36==c.charCodeAt(b+1|0)?(d=B(c.substr(0,b|0))+"$",e=b=b+1|0,c=d+B(c.substr(e))):
(d=B(c.substr(0,b|0)),e=b=b+1|0,c=d+B(c.substr(e)));a=a.replace(/\+/g,c);return pb(a,!1)};function F(a,b){this.h=b;for(var c=[],d=!0,e=a.length-1;0<=e;e--){var f=a[e]|0;d&&f==b||(c[e]=f,d=!1)}this.g=c}var tb={};function ub(a){return-128<=a&&128>a?y(tb,a,function(b){return new F([b|0],0>b?-1:0)}):new F([a|0],0>a?-1:0)}function G(a){if(isNaN(a)||!isFinite(a))return H;if(0>a)return I(G(-a));for(var b=[],c=1,d=0;a>=c;d++)b[d]=a/c|0,c*=4294967296;return new F(b,0)}var H=ub(0),J=ub(1),vb=ub(16777216);
function K(a){if(-1==a.h)return-K(I(a));for(var b=0,c=1,d=0;d<a.g.length;d++){var e=L(a,d);b+=(0<=e?e:4294967296+e)*c;c*=4294967296}return b}F.prototype.toString=function(a){a=a||10;if(2>a||36<a)throw Error("radix out of range: "+a);if(M(this))return"0";if(-1==this.h)return"-"+I(this).toString(a);for(var b=G(Math.pow(a,6)),c=this,d="";;){var e=wb(c,b).g;c=N(c,O(e,b));var f=((0<c.g.length?c.g[0]:c.h)>>>0).toString(a);c=e;if(M(c))return f+d;for(;6>f.length;)f="0"+f;d=f+d}};
function L(a,b){return 0>b?0:b<a.g.length?a.g[b]:a.h}function M(a){if(0!=a.h)return!1;for(var b=0;b<a.g.length;b++)if(0!=a.g[b])return!1;return!0}function P(a,b){a=N(a,b);return-1==a.h?-1:M(a)?0:1}function I(a){for(var b=a.g.length,c=[],d=0;d<b;d++)c[d]=~a.g[d];return(new F(c,~a.h)).add(J)}F.prototype.abs=function(){return-1==this.h?I(this):this};
F.prototype.add=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0,e=0;e<=b;e++){var f=d+(L(this,e)&65535)+(L(a,e)&65535),g=(f>>>16)+(L(this,e)>>>16)+(L(a,e)>>>16);d=g>>>16;f&=65535;g&=65535;c[e]=g<<16|f}return new F(c,c[c.length-1]&-2147483648?-1:0)};function N(a,b){return a.add(I(b))}
function O(a,b){if(M(a)||M(b))return H;if(-1==a.h)return-1==b.h?O(I(a),I(b)):I(O(I(a),b));if(-1==b.h)return I(O(a,I(b)));if(0>P(a,vb)&&0>P(b,vb))return G(K(a)*K(b));for(var c=a.g.length+b.g.length,d=[],e=0;e<2*c;e++)d[e]=0;for(e=0;e<a.g.length;e++)for(var f=0;f<b.g.length;f++){var g=L(a,e)>>>16,k=L(a,e)&65535,t=L(b,f)>>>16,n=L(b,f)&65535;d[2*e+2*f]+=k*n;Q(d,2*e+2*f);d[2*e+2*f+1]+=g*n;Q(d,2*e+2*f+1);d[2*e+2*f+1]+=k*t;Q(d,2*e+2*f+1);d[2*e+2*f+2]+=g*t;Q(d,2*e+2*f+2)}for(e=0;e<c;e++)d[e]=d[2*e+1]<<16|
d[2*e];for(e=c;e<2*c;e++)d[e]=0;return new F(d,0)}function Q(a,b){for(;(a[b]&65535)!=a[b];)a[b+1]+=a[b]>>>16,a[b]&=65535,b++}function S(a,b){this.g=a;this.h=b}
function wb(a,b){if(M(b))throw Error("division by zero");if(M(a))return new S(H,H);if(-1==a.h)return b=wb(I(a),b),new S(I(b.g),I(b.h));if(-1==b.h)return b=wb(a,I(b)),new S(I(b.g),b.h);if(30<a.g.length){if(-1==a.h||-1==b.h)throw Error("slowDivide_ only works with positive integers.");for(var c=J,d=b;0>=P(d,a);)c=xb(c,1),d=xb(d,1);var e=T(c,1),f=T(d,1);d=T(d,2);for(c=T(c,2);!M(d);){var g=f.add(d);0>=P(g,a)&&(e=e.add(c),f=g);d=T(d,1);c=T(c,1)}b=N(a,O(e,b));return new S(e,b)}for(e=H;0<=P(a,b);){c=Math.max(1,
Math.floor(K(a)/K(b)));d=Math.ceil(Math.log(c)/Math.LN2);d=48>=d?1:Math.pow(2,d-48);f=G(c);for(g=O(f,b);-1==g.h||0<P(g,a);)c-=d,f=G(c),g=O(f,b);M(f)&&(f=J);e=e.add(f);a=N(a,g)}return new S(e,a)}F.prototype.and=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)&L(a,d);return new F(c,this.h&a.h)};F.prototype.or=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)|L(a,d);return new F(c,this.h|a.h)};
F.prototype.xor=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)^L(a,d);return new F(c,this.h^a.h)};function xb(a,b){var c=b>>5;b%=32;for(var d=a.g.length+c+(0<b?1:0),e=[],f=0;f<d;f++)e[f]=0<b?L(a,f-c)<<b|L(a,f-c-1)>>>32-b:L(a,f-c);return new F(e,a.h)}function T(a,b){var c=b>>5;b%=32;for(var d=a.g.length-c,e=[],f=0;f<d;f++)e[f]=0<b?L(a,f+c)>>>b|L(a,f+c+1)<<32-b:L(a,f+c);return new F(e,a.h)};N(xb(J,32),J);N(xb(J,128),J);function yb(a){a&&"function"==typeof a.v&&a.v()};function U(){this.h=this.h;this.g=this.g}U.prototype.h=!1;U.prototype.v=function(){this.h||(this.h=!0,this.j())};U.prototype.j=function(){if(this.g)for(;this.g.length;)this.g.shift()()};var zb=!z||9<=Number(bb),Ab=!z||9<=Number(bb),Bb=z&&!y(Za,"9",function(){for(var a=0,b=ua(String(Ya)).split("."),c=ua("9").split("."),d=Math.max(b.length,c.length),e=0;0==a&&e<d;e++){var f=b[e]||"",g=c[e]||"";do{f=/(\d*)(\D*)(.*)/.exec(f)||["","","",""];g=/(\d*)(\D*)(.*)/.exec(g)||["","","",""];if(0==f[0].length&&0==g[0].length)break;a=Ca(0==f[1].length?0:parseInt(f[1],10),0==g[1].length?0:parseInt(g[1],10))||Ca(0==f[2].length,0==g[2].length)||Ca(f[2],g[2]);f=f[3];g=g[3]}while(0==a)}return 0<=a}),
Cb=function(){if(!l.addEventListener||!Object.defineProperty)return!1;var a=!1,b=Object.defineProperty({},"passive",{get:function(){a=!0}});try{l.addEventListener("test",la,b),l.removeEventListener("test",la,b)}catch(c){}return a}();function Db(a,b){this.type=a;this.g=this.target=b;this.defaultPrevented=!1}Db.prototype.h=function(){this.defaultPrevented=!0};function V(a,b){Db.call(this,a?a.type:"");this.relatedTarget=this.g=this.target=null;this.button=this.screenY=this.screenX=this.clientY=this.clientX=0;this.key="";this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=!1;this.state=null;this.pointerId=0;this.pointerType="";this.i=null;if(a){var c=this.type=a.type,d=a.changedTouches&&a.changedTouches.length?a.changedTouches[0]:null;this.target=a.target||a.srcElement;this.g=b;if(b=a.relatedTarget){if(Qa){a:{try{Ma(b.nodeName);var e=!0;break a}catch(f){}e=
!1}e||(b=null)}}else"mouseover"==c?b=a.fromElement:"mouseout"==c&&(b=a.toElement);this.relatedTarget=b;d?(this.clientX=void 0!==d.clientX?d.clientX:d.pageX,this.clientY=void 0!==d.clientY?d.clientY:d.pageY,this.screenX=d.screenX||0,this.screenY=d.screenY||0):(this.clientX=void 0!==a.clientX?a.clientX:a.pageX,this.clientY=void 0!==a.clientY?a.clientY:a.pageY,this.screenX=a.screenX||0,this.screenY=a.screenY||0);this.button=a.button;this.key=a.key||"";this.ctrlKey=a.ctrlKey;this.altKey=a.altKey;this.shiftKey=
a.shiftKey;this.metaKey=a.metaKey;this.pointerId=a.pointerId||0;this.pointerType="string"===typeof a.pointerType?a.pointerType:Eb[a.pointerType]||"";this.state=a.state;this.i=a;a.defaultPrevented&&V.o.h.call(this)}}oa(V,Db);var Fb=[1,4,2],Eb={2:"touch",3:"pen",4:"mouse"};V.prototype.h=function(){V.o.h.call(this);var a=this.i;if(a.preventDefault)a.preventDefault();else if(a.returnValue=!1,Bb)try{if(a.ctrlKey||112<=a.keyCode&&123>=a.keyCode)a.keyCode=-1}catch(b){}};var Gb="closure_listenable_"+(1E6*Math.random()|0);var Hb=0;function Ib(a,b,c,d,e){this.listener=a;this.g=null;this.src=b;this.type=c;this.capture=!!d;this.h=e;this.key=++Hb;this.m=this.s=!1}function Jb(a){a.m=!0;a.listener=null;a.g=null;a.src=null;a.h=null};function Kb(a){this.src=a;this.g={};this.h=0}Kb.prototype.add=function(a,b,c,d,e){var f=a.toString();a=this.g[f];a||(a=this.g[f]=[],this.h++);var g;a:{for(g=0;g<a.length;++g){var k=a[g];if(!k.m&&k.listener==b&&k.capture==!!d&&k.h==e)break a}g=-1}-1<g?(b=a[g],c||(b.s=!1)):(b=new Ib(b,this.src,f,!!d,e),b.s=c,a.push(b));return b};function Lb(a,b){var c=b.type;if(c in a.g){var d=a.g[c],e=qa(d,b),f;(f=0<=e)&&Array.prototype.splice.call(d,e,1);f&&(Jb(b),0==a.g[c].length&&(delete a.g[c],a.h--))}};var Mb="closure_lm_"+(1E6*Math.random()|0),Nb={},Ob=0;function Pb(a,b,c,d,e){if(d&&d.once)return Qb(a,b,c,d,e);if(Array.isArray(b)){for(var f=0;f<b.length;f++)Pb(a,b[f],c,d,e);return null}c=Rb(c);return a&&a[Gb]?a.g.add(String(b),c,!1,ma(d)?!!d.capture:!!d,e):Sb(a,b,c,!1,d,e)}
function Sb(a,b,c,d,e,f){if(!b)throw Error("Invalid event type");var g=ma(e)?!!e.capture:!!e,k=Tb(a);k||(a[Mb]=k=new Kb(a));c=k.add(b,c,d,g,f);if(c.g)return c;d=Ub();c.g=d;d.src=a;d.listener=c;if(a.addEventListener)Cb||(e=g),void 0===e&&(e=!1),a.addEventListener(b.toString(),d,e);else if(a.attachEvent)a.attachEvent(Vb(b.toString()),d);else if(a.addListener&&a.removeListener)a.addListener(d);else throw Error("addEventListener and attachEvent are unavailable.");Ob++;return c}
function Ub(){var a=Wb,b=Ab?function(c){return a.call(b.src,b.listener,c)}:function(c){c=a.call(b.src,b.listener,c);if(!c)return c};return b}function Qb(a,b,c,d,e){if(Array.isArray(b)){for(var f=0;f<b.length;f++)Qb(a,b[f],c,d,e);return null}c=Rb(c);return a&&a[Gb]?a.g.add(String(b),c,!0,ma(d)?!!d.capture:!!d,e):Sb(a,b,c,!0,d,e)}
function Xb(a){if("number"!==typeof a&&a&&!a.m){var b=a.src;if(b&&b[Gb])Lb(b.g,a);else{var c=a.type,d=a.g;b.removeEventListener?b.removeEventListener(c,d,a.capture):b.detachEvent?b.detachEvent(Vb(c),d):b.addListener&&b.removeListener&&b.removeListener(d);Ob--;(c=Tb(b))?(Lb(c,a),0==c.h&&(c.src=null,b[Mb]=null)):Jb(a)}}}function Vb(a){return a in Nb?Nb[a]:Nb[a]="on"+a}
function Yb(a,b,c,d){var e=!0;if(a=Tb(a))if(b=a.g[b.toString()])for(b=b.concat(),a=0;a<b.length;a++){var f=b[a];f&&f.capture==c&&!f.m&&(f=Zb(f,d),e=e&&!1!==f)}return e}function Zb(a,b){var c=a.listener,d=a.h||a.src;a.s&&Xb(a);return c.call(d,b)}
function Wb(a,b){if(a.m)return!0;if(!Ab){if(!b)a:{b=["window","event"];for(var c=l,d=0;d<b.length;d++)if(c=c[b[d]],null==c){b=null;break a}b=c}d=b;b=new V(d,this);c=!0;if(!(0>d.keyCode||void 0!=d.returnValue)){a:{var e=!1;if(0==d.keyCode)try{d.keyCode=-1;break a}catch(g){e=!0}if(e||void 0==d.returnValue)d.returnValue=!0}d=[];for(e=b.g;e;e=e.parentNode)d.push(e);a=a.type;for(e=d.length-1;0<=e;e--){b.g=d[e];var f=Yb(d[e],a,!0,b);c=c&&f}for(e=0;e<d.length;e++)b.g=d[e],f=Yb(d[e],a,!1,b),c=c&&f}return c}return Zb(a,
new V(b,this))}function Tb(a){a=a[Mb];return a instanceof Kb?a:null}var $b="__closure_events_fn_"+(1E9*Math.random()>>>0);function Rb(a){if("function"===typeof a)return a;a[$b]||(a[$b]=function(b){return a.handleEvent(b)});return a[$b]};function W(a){U.call(this);this.l=a;this.i={}}oa(W,U);var ac=[];function bc(a){ra(a.i,function(b,c){this.i.hasOwnProperty(c)&&Xb(b)},a);a.i={}}W.prototype.j=function(){W.o.j.call(this);bc(this)};W.prototype.handleEvent=function(){throw Error("EventHandler.handleEvent not implemented");};function cc(a){U.call(this);this.i=a||document.body;this.l=new W(this);a=na(yb,this.l);this.h?a():(this.g||(this.g=[]),this.g.push(a));a=this.l;var b=this.i,c=this.u,d="click";Array.isArray(d)||(d&&(ac[0]=d.toString()),d=ac);for(var e=0;e<d.length;e++){var f=Pb(b,d[e],c||a.handleEvent,!1,a.l||a);if(!f)break;a.i[f.key]=f}}h(cc,U);
cc.prototype.u=function(a){if(!(!(zb?0==a.i.button:"click"==a.type||a.i.button&Fb[0])||Sa&&a.ctrlKey||a.defaultPrevented))for(var b=a.target;b&&b!=this.i;){if(b.tagName&&"a"==b.tagName.toLowerCase()){var c=b.getAttribute("href")||b.getAttributeNS("http://www.w3.org/1999/xlink","href"),d=c;try{var e=rb(c)[3];var f;if(f="www.google.com"===pb(e,!0)){var g=rb(c)[5];f="/url"===pb(g,!0)}if(f){var k=sb(c,"q");d=k?k:sb(c,"url")}}catch(C){a:{var t=C;if(null!=t){var n=t.A;if(null!=n){C=n;break a}}if(t instanceof
TypeError){var R=n=new kb;R.l=B(t);hb(R);n.g="__noinit__";n.g=t;n.i(new TypeError(n));t=n}else R=n=new E,R.l=B(t),hb(R),n.g="__noinit__",n.g=t,n.i(Error(n)),t=n;C=t}if(!(C instanceof ib))throw C.h;}d=null!=d?d:"";if(c!=d){e=void 0;b={target:"_blank",noreferrer:!0};c=window;d instanceof q?f=d:(f="undefined"!=typeof d.href?d.href:String(d),f instanceof q||(f="object"==typeof f&&f.h?f.g():String(f),Fa.test(f)?f=new q(f,r):(f=String(f),f=f.replace(/(%0A|%0D)/g,""),f=(g=f.match(Ea))&&Da.test(g[1])?new q(f,
r):null)),f=f||Ha);d=b.target||d.target;g=[];for(e in b)switch(e){case "width":case "height":case "top":case "left":g.push(e+"="+b[e]);break;case "target":case "noopener":case "noreferrer":break;default:g.push(e+"="+(b[e]?1:0))}e=g.join(",");if((w("iPhone")&&!w("iPod")&&!w("iPad")||w("iPad")||w("iPod"))&&c.navigator&&c.navigator.standalone&&d&&"_self"!=d)e="A",g=document,e=String(e),"application/xhtml+xml"===g.contentType&&(e=e.toLowerCase()),g=e=g.createElement(e),f=f instanceof q?f:Ga(f),g.href=
u(f),e.setAttribute("target",d),b.noreferrer&&e.setAttribute("rel","noreferrer"),b=document.createEvent("MouseEvent"),b.initMouseEvent("click",!0,!0,c,1),e.dispatchEvent(b);else if(b.noreferrer){if(c=La("",c,d,e),b=u(f),c){Pa&&-1!=b.indexOf(";")&&(b="'"+b.replace(/'/g,"%27")+"'");c.opener=null;Ba.test(b)&&(-1!=b.indexOf("&")&&(b=b.replace(va,"&amp;")),-1!=b.indexOf("<")&&(b=b.replace(wa,"&lt;")),-1!=b.indexOf(">")&&(b=b.replace(xa,"&gt;")),-1!=b.indexOf('"')&&(b=b.replace(ya,"&quot;")),-1!=b.indexOf("'")&&
(b=b.replace(za,"&#39;")),-1!=b.indexOf("\x00")&&(b=b.replace(Aa,"&#0;")));b='<meta name="referrer" content="no-referrer"><meta http-equiv="refresh" content="0; url='+b+'">';if(void 0===m)if(d=null,(e=l.trustedTypes)&&e.createPolicy){try{d=e.createPolicy("goog#html",{createHTML:pa,createScript:pa,createScriptURL:pa})}catch(C){l.console&&l.console.error(C.message)}m=d}else m=d;b=(d=m)?d.createHTML(b):b;b=new x(b,null,Ka);(c=c.document)&&c.write&&(c.write(b instanceof x&&b.constructor===x?b.i:"type_error:SafeHtml"),
c.close())}}else(c=La(f,c,d,e))&&b.noopener&&(c.opener=null);a.h();break}}b=b.parentNode}};function dc(a){new cc(a)}var X=["DOCS_installLinkReferrerSanitizer"],Y=l;X[0]in Y||"undefined"==typeof Y.execScript||Y.execScript("var "+X[0]);for(var Z;X.length&&(Z=X.shift());)X.length||void 0===dc?Y[Z]&&Y[Z]!==Object.prototype[Z]?Y=Y[Z]:Y=Y[Z]={}:Y[Z]=dc;}).call(this);
</script><script type="text/javascript" nonce="">DOCS_installLinkReferrerSanitizer();</script></body></html>